home *** CD-ROM | disk | FTP | other *** search
/ ftp.cs.arizona.edu / ftp.cs.arizona.edu.tar / ftp.cs.arizona.edu / icon / newsgrp / group00a.txt / 000069_icon-group-sender _Mon Apr 17 13:31:54 2000.msg < prev    next >
Internet Message Format  |  2001-01-03  |  3KB

  1. Return-Path: <icon-group-sender>
  2. Received: (from root@localhost)
  3.     by baskerville.CS.Arizona.EDU (8.9.1a/8.9.1) id NAA09054
  4.     for icon-group-addresses; Mon, 17 Apr 2000 13:31:31 -0700 (MST)
  5. Message-Id: <200004172031.NAA09054@baskerville.CS.Arizona.EDU>
  6. From: "Frank J. Lhota" <NOSPAM.Frank.Lhota@lexma.meitech.com>
  7. X-Newsgroups: comp.lang.icon
  8. Subject: Re: Reversible assignment really reversible ?
  9. X-Priority: 3
  10. X-MSMail-Priority: Normal
  11. X-Newsreader: Microsoft Outlook Express 5.00.2919.6600
  12. X-Mimeole: Produced By Microsoft MimeOLE V5.00.2919.6600
  13. Date: Mon, 17 Apr 2000 15:33:47 -0000
  14. X-Trace: client 956000040 38.163.203.81 (Mon, 17 Apr 2000 15:34:00 EDT)
  15. To: icon-group@optima.CS.Arizona.EDU
  16. Errors-To: icon-group-errors@optima.CS.Arizona.EDU
  17. Status: RO
  18.  
  19. > Although I appreciate all replies explaining the pitfalls of
  20. co-expressions
  21. > (maybe someone could also explain the INFIX @-operator, I always wondered
  22. > about that one too), I'm still puzzled by the implementation of reversible
  23. > assignment.
  24. >
  25. #---------------------------------------------------------------------------
  26. ---
  27. > procedure revass(a,b)         # pardon the expression
  28. > local c
  29. > c:=a
  30. > suspend ((a:=b)  |  ((a:=c) & (&fail)))
  31. > end                                          ######
  32. >
  33. #---------------------------------------------------------------------------
  34. ---
  35. > procedure myrevass(a,b)
  36. > local c
  37. > c:=a
  38. > suspend ((a:=b)  |  ((a:=c)  ))      # &(&fail)))
  39. > end                                                   #######
  40. >
  41. #---------------------------------------------------------------------------
  42. ---
  43. >
  44. > Which considerations (if any  ;-)  led to picking the first
  45. > implementation ?
  46.  
  47. The idea behind reversible assignment is to provide data backtracking. If we
  48. execute
  49.  
  50. i := 1;
  51. text ? {
  52.     (i := 3) &
  53.     (j := (i < find("q")))
  54.     }
  55.  
  56. and the expression (i < find("q")) fails, i will end up with the value 3. We
  57. will backtrack to the expression (i := 3), but normal assignment is not a
  58. generator, and so the previous value of i is not restored. Assume that we do
  59. not want the scanning expression to change i unless it succeeds. We can get
  60. the desired effect by using reversable assignment.
  61.  
  62. i := 1;
  63. text ? {
  64.     (i <- 3) &
  65.     (j := (i < find("q")))
  66.     }
  67.  
  68. Now if (i < find("q")) succeeds (for example, if text is "unique"), the
  69. assignment of 3 to i remains in effect, and if (i < find("q")) fails, the
  70. old value of i is restored.
  71.  
  72. If I understand your question correctly, you are wondering why reversible
  73. assignment fails after resumption. The reason for this is that it would have
  74. an undesired effect on control backtracking. Consider the scanning
  75. expression above, where text is "queen":
  76.  
  77.     (i <- 3) assigns 3 to i and suspends;
  78.     (j < find("q")) fails, so we resume the most recently suspended
  79. expression;
  80.     (i <- 3) is resumed, so i gets its previous value (1);
  81.  
  82. Now if (i <- 3) were to succeed after being resumed, goal-driven evaluation
  83. requires that we evaluate (i < find("q")) again, this time with i=1. This
  84. evaluation would succeed, and therefor the whole scanning expression would
  85. succeed, giving j=1. Clearly, this is not what you wanted.
  86.  
  87.  
  88.  
  89.  
  90.